﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace System.Web.Mvc
{
    /// <summary>
    /// 提供针对 ASP.NET MVC 控制器 Action 返回结果输出方法输出 <see cref="System.Web.Mvc.JsonStatusResult"/> 的一组扩展。
    /// </summary>
    public static class JsonStatusResultExtensions
    {
        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="jsonStatus">表示用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 数据响应格式。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, JsonStatus jsonStatus, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(jsonStatus, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="statusResult">表示 HTTP 请求的处理状态(是否处理成功)。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, bool? statusResult, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(statusResult, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="statusCode">表示 HTTP 状态码(仅作为 JSON 结果输出，与 HttpResponse.StatusCode 无关)。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, int? statusCode, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(statusCode, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="statusCode">表示 HTTP 状态码(仅作为 JSON 结果输出，与 HttpResponse.StatusCode 无关)。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, HttpStatusCode statusCode, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(statusCode, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="message">表示 HTTP 请求处理结果的附加消息。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, string message, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(message, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="statusResult">表示 HTTP 请求的处理状态(是否处理成功)。</param>
        /// <param name="message">表示 HTTP 请求处理结果的附加消息。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, bool? statusResult, string message, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(statusResult, message, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="statusResult">表示 HTTP 请求的处理状态(是否处理成功)。</param>
        /// <param name="message">表示 HTTP 请求处理结果的附加消息。</param>
        /// <param name="url">表示 HTTP 请求处理结果的附加 URL 地址。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, bool? statusResult, string message, string url, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(statusResult, message, url, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="statusResult">表示 HTTP 请求的处理状态(是否处理成功)。</param>
        /// <param name="statusCode">表示 HTTP 状态码(仅作为 JSON 结果输出，与 HttpResponse.StatusCode 无关)。</param>
        /// <param name="statusDescription">表示 HTTP 状态表示(仅作为 JSON 结果输出，与 HttpResponse.StatusDescription 无关)。</param>
        /// <param name="message">表示 HTTP 请求处理结果的附加消息。</param>
        /// <param name="url">表示 HTTP 请求处理结果的附加 URL 地址。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, bool? statusResult, int? statusCode, string statusDescription, string message, string url, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(statusResult, statusCode, statusDescription, message, url, jsonRequestBehavior);
        }

        /// <summary>
        /// 创建一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。
        /// <see cref="System.Web.Mvc.JsonStatusResult"/> 会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="controller">表示 ASP.NET MVC 控制器 对象。</param>
        /// <param name="statusResult">表示 HTTP 请求的处理状态(是否处理成功)。</param>
        /// <param name="statusCode">表示 HTTP 状态码(仅作为 JSON 结果输出，与 HttpResponse.StatusCode 无关)。</param>
        /// <param name="statusDescription">表示 HTTP 状态表示(仅作为 JSON 结果输出，与 HttpResponse.StatusDescription 无关)。</param>
        /// <param name="message">表示 HTTP 请求处理结果的附加消息。</param>
        /// <param name="url">表示 HTTP 请求处理结果的附加 URL 地址。</param>
        /// <param name="jsonRequestBehavior">指示是否允许来自客户端的 HTTP GET 请求。</param>
        /// <returns>一个用于返回用户定义的通用 JavaScript 对象表示法(JSON 数据格式) 内容的 <see cref="System.Web.Mvc.HttpStatusCodeResult"/> 对象。</returns>
        public static JsonStatusResult JsonStatus(this Controller controller, bool? statusResult, HttpStatusCode statusCode, string statusDescription, string message, string url, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet)
        {
            return new JsonStatusResult(statusResult, statusCode, statusDescription, message, url, jsonRequestBehavior);
        }
    }
}
